/**
 * 给定N个数，从中挑出若干个使得其和被3600整除
 * 首先N超过3600一定有解。
 * 对数组求一个前缀和S，则S一共有N个数，当N超过3600以后必然存在两个S其对3600取模相等
 * 则这两个S之间的A加起来能被3600整除。
 * 因此只要O(3600^2)即可
 * 01背包，滚动数组优化。
 * 只用一个数组做位运算始终 
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;
using vpii = vector<pii>;
using vi = vector<int>;
using vll = vector<llt>;


template<typename T>
void input(vector<T>&v, int n){
    v.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> v[i];
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

llt const INF = 0x1F2F3F4F5F6F7F8F;
llt const NINF = -INF;
llt const MOD = 998244353LL;

int N;
vector<int> A;
vi D;

int chkadd(int a, int b){
    if(-1 == a or -1 == b) return -1;
    return a + b;
}

void chkmax(int & a, int b){
    if(-1 == b) return;
    if(-1 == a or a < b) a = b;
    return;
}

void work(){
    cin >> N;
    input(A, N);
    if(N >= 3600) return (void)(cout << "YES\n");
    for(int i=1;i<=N;++i) A[i] %= 3600;

    D.assign(3600, -1);
    D[0] = 0;
    for(int i=1;i<=N;++i){
        vector<int> tmp(D.begin(), D.end());
        for(int j=0;j<3600;++j){
            chkmax(tmp[j], chkadd(D[(j + 3600 - A[i]) % 3600], 1));
        }
        D.swap(tmp);
    }
    cout << (D[0] ? "YES\n" : "NO\n");
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    cin >> nofkase; 
    while(nofkase--) work();    
    return 0;
}
